package br.uniceub.fsw.talentos.dao;

import br.uniceub.fsw.arquitetura.persistencia.dao.BaseDAO;
import br.uniceub.fsw.arquitetura.persistencia.dao.ConstrutorSQL;
import br.uniceub.fsw.talentos.vo.TipoHabilidadeVO;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 * Data Access Object da entidade TipoHabilidade. Essa classe é responsável por todas as 
 * operações de banco de dados relacionadas à entidade.
 * 
 @author   Bruno Henrique Sousa do Val 2046369/2
 *         
 */
public class TipoHabilidadeDAO extends BaseDAO<TipoHabilidadeVO> {

    @Override
    public void inserir(TipoHabilidadeVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("INSERT INTO TT_TIPOHABILIDADE(NO_TIPOHABILIDADE)");
        query.append("VALUES (?)");

        List<?> parametros = criarParametros(entidade.getNoTipoHabilidade());

        Integer idGerado = ((Long) executarInsercao(query.toString(), parametros)).intValue();
        
        entidade.setIdTipoHabilidade(idGerado);
    }

    @Override
    public void alterar(TipoHabilidadeVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("UPDATE TT_TIPOHABILIDADE SET NO_TIPOHABILIDADE = ?");
        query.append("WHERE ID_TIPOHABILIDADE = ?");

        List<?> parametros = criarParametros(entidade.getNoTipoHabilidade(), entidade.getIdTipoHabilidade());

        executarAlteracao(query.toString(), parametros);
    }

    @Override
    public void excluir(TipoHabilidadeVO entidade) {

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("DELETE FROM TT_TIPOHABILIDADE");
        query.append("WHERE ID_TIPOHABILIDADE = ?");

        executarAlteracao(query.toString(), criarParametros(entidade.getIdTipoHabilidade()));
    }

    @Override
    public TipoHabilidadeVO consultarPorId(Serializable id) {

        TipoHabilidadeVO tipoHabilidade = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TT_TIPOHABILIDADE T WHERE T.ID_TIPOHABILIDADE = ?");

        tipoHabilidade = consultarUm(query.toString(), criarParametros(id));

        return tipoHabilidade;
    }

    @Override
    public List<TipoHabilidadeVO> consultarPorExemplo(TipoHabilidadeVO exemplo) {

        List<TipoHabilidadeVO> listaRetorno = null;

        ConstrutorSQL query = new ConstrutorSQL();

        query.append("SELECT * FROM TT_TIPOHABILIDADE T WHERE 1=1");

        mapearQueryParaExemplo(query, exemplo);

        listaRetorno = consultar(query.toString(), recuperarParametros());

        return listaRetorno;
    }

    /**
     * Recupera uma lista completa de tipos ordenada pelo nome
     * 
     * @return lista de grupos
     */
    public List<TipoHabilidadeVO> consultarTiposOrdenadoPorNome() {
        ConstrutorSQL sql = new ConstrutorSQL();
        
        sql.append("SELECT *");
        sql.append("FROM TT_TIPOHABILIDADE A");
        sql.append("ORDER BY NO_TIPOHABILIDADE ASC");
        
        return consultar(sql.toString());
    }

    @Override
    protected TipoHabilidadeVO extrairObjetoResultado(ResultSet rs) throws SQLException {

        TipoHabilidadeVO tipoHabilidade = new TipoHabilidadeVO();
        
        tipoHabilidade.setIdTipoHabilidade(rs.getInt("ID_TIPOHABILIDADE"));
        tipoHabilidade.setNoTipoHabilidade(rs.getString("NO_TIPOHABILIDADE"));

        return tipoHabilidade;
    }

    @Override
    protected void mapearQueryParaExemplo(ConstrutorSQL query, TipoHabilidadeVO exemplo) {

        if (exemplo.getNoTipoHabilidade() != null && exemplo.getNoTipoHabilidade().trim().length() > 0) {
            query.append("AND T.NO_TIPOHABILIDADE LIKE ?");
            adicionarParametro("%" + exemplo.getNoTipoHabilidade() + "%");
        }
    }
}